home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2004 April
/
Gamestar_61_2004-04_dvdb.iso
/
DVDStar
/
Editace
/
hltp.exe
/
{app}
/
Source Code
/
Zoners Half-Life Tools
/
makedep.pl
< prev
next >
Wrap
Perl Script
|
2001-04-18
|
5KB
|
195 lines
#!/usr/bin/perl
# Copyright (C) 2000 Sean Cavanaugh
# This file is licensed under the terms of the GNU Public License
# (see GPL.txt, or http://www.gnu.org/copyleft/gpl.txt)
@filespecs =
(
'*.cpp',
'*.c',
'*.h',
);
@pathspecs =
(
'',
'template',
'common',
'hlcsg',
'hlbsp',
'hlvis',
'hlrad',
'netvis',
);
$debug = 0;
$bUseIncludeEnv = 0;
$MODE = "\$(OUTDIR)";
#$EXT = ".o";
#$EXT = ".obj";
# rip include references out of source files
sub ScanSource
{
my ($file) = @_;
my @rval = ();
open(SOURCEFILE, "<$file") || die "Could not open file $file\n";
while (<SOURCEFILE>)
{
if (/^[\s]*#include[\s]*/)
{
s/^[\s]*#include[\s]*//; # remove #include and trailing characters
s/[\<\>\"\n]//g; # remove all quotes and <> around filename
s/\.h.*/\.h/i; # truncate everything after the .h
push(@rval, $_); # add the include reference to the list
}
}
close SOURCEFILE;
return @rval;
}
my $table;
my $flagged;
# attempt to locate header in include path/pathspecs, remove from list if not found
sub TranslateHeaders
{
my ($file, @headers) = @_;
my @translated = ();
my @searchpaths = @pathspecs;
push @searchpaths, '';
foreach my $header (@headers)
{
my $found = 0;
foreach my $path (@searchpaths)
{
if (!$found)
{
my $prefix;
if ($path eq "")
{
$prefix = '';
}
else
{
$prefix = "$path/";
}
my $find = $prefix.$header;
print STDERR "searching for [$find]\n" if $debug;
if (-e $find)
{
$_ = $find;
my $translatedfile = $_;
push @translated, $translatedfile;
print STDERR "found $translatedfile\n" if $debug;
$found = 1;
}
}
}
if (!$found)
{
print STDERR "removing unfindable header $header\n";
}
}
print STDERR "file [$file] depends on @translated\n" if $debug;
$table{$file}= [ @translated ];
$flagged{$file}=0;
# TODO: handle environemnt variable INCLUDE
return @translated;
}
sub RecurseGenerateList
{
my ($filename) = @_;
my $rval = $filename;
$flagged{$filename} = 1; # prevent dependency recursion
print STDERR "begin [$filename]:[@{$table{$filename}}]\n" if $debug;
foreach $item ( @{$table{$filename}} )
{
if ($flagged{$item} == 1)
{
print STDERR "$filename flagged already\n" if $debug;
goto skip;
}
if ($item eq $filename)
{
print STDERR "item == filename ($filename)\n" if $debug;
goto skip;
}
if ($item eq "")
{
print STDERR "item == null\n" if $debug;
goto skip;
}
$rval .= ' '.RecurseGenerateList($item);
$flagged{$item} = 1; # prevent include recursion
skip:
}
return $rval;
}
sub ResetFlags
{
foreach $item ( keys %flagged )
{
$flagged{$item} = 0;
}
}
sub main
{
foreach my $path (@pathspecs)
{
foreach my $filespec (@filespecs)
{
my $search;
if ($path eq "")
{
$search = $filespec;
}
else
{
$search = "$path/$filespec";
}
my @files = glob($search);
foreach my $file ( @files )
{
TranslateHeaders($file, ScanSource($file));
}
}
}
my $x = 0;
foreach $item ( sort keys %flagged )
{
print STDERR "working on file [$item]\n" if $debug;
ResetFlags();
my $biglist = RecurseGenerateList($item);
$_ = $item;
if (s/([\w]*)\.(cpp|c)/$MODE\/$1\$(OBJEXT)/gi) # We only care about object files and their dependencies
{
print STDOUT "$_: $biglist\n";
}
}
$x++;
return 0;
}
&main;